home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / midi / ptsupp_1.lha / PT Support archive / ProTrackerRep.S < prev    next >
Text File  |  1995-09-09  |  29KB  |  1,396 lines

  1. ;------------------------------------------------------------------------------
  2. ;
  3. ;    ProTracker playroutine, revision 2C
  4. ;
  5. ;    Coded by Lars "ZAP" Hamre
  6. ;    Updated by Håvard "HOWARD/MENTAL DISEASES" Pedersen
  7. ;
  8. ;REVISION 2B:
  9. ;* Mastervolume. (Separate left and right for balance controls.)
  10. ;* Overstep for players using program mode.
  11. ;* Rewind/fast forward. (One pattern)
  12. ;* Easy CIA-utilising.
  13. ;* DMAWait solved. (Finally!)
  14. ;* No longer clears one word behind end of module if instrument 31 is unused.
  15. ;* F00 really halts module now. (Was ignored)
  16. ;* Slower than before. =(
  17. ;* Various small optimisations in attempt to compensate. (Bugs may appear!)
  18. ;* PT_End now stops module, even if music is still called.
  19. ;* Added (selectable) 68020+ optimisations. (Not powerful yet...) 8(
  20. ;
  21. ;REVISION 2C:
  22. ;* Overstep didn't trig on halting the module. Now does.
  23. ;* Made overstep selectable.
  24. ;* Added NoiseTracker compatibility. (Selectable through PT__NTComp) Both NTs
  25. ;  vibrato and loop-position is supported. PT modules are still played as before.
  26. ;* Fixed some ucase/lcase confusion on some labels.
  27. ;* CIA-tempo wasn't reset upon PT_Init(). Now is.
  28. ;
  29. ;DMAWAIT ISSUES:
  30. ;Commodore states that atleast one rasterline must pass before rewriting to
  31. ;the audio hardware after disabling the DMA. A DMA-delay of 80 will wait
  32. ;_exactly_ one line. Still, OctaMed uses a delay equal to 64, and it sounds OK.
  33. ;Still, delays which sounds fine on your computer _may_ turn up bad on faster
  34. ;machines, so please add some extra for margins.
  35. ;
  36. ;PLEASE NOTE!
  37. ;This replay assumes exclusive access to audio hardware and OCS/ECS/AGA or
  38. ;compatible audio chips. This behaviour is _NOT_ encouraged by Commodore!
  39. ;
  40. ;------------------------------------------------------------------------------
  41.  
  42.     IFND    PT_MasterVol            ; Mastervolume ON/OFF
  43. PT_MasterVol    =    0            ; Call PT_SetMasterVol with
  44.     ENDC                    ; Left in D0 and Right in D1
  45.                         ; ( 0 - 64 )
  46.  
  47.     IFND    PT__OverStep            ; Signal when module is
  48. PT__OverStep    =    0            ; finished. PT_OverStep
  49.     ENDC                    ; contains 1 if end has reached
  50.                         ; and -1 if rewound past
  51.                         ; beginning.
  52.  
  53.     IFND    PT__WindFuncs            ; Fast forward / Rewind
  54. PT__WindFuncs    =    0
  55.     ENDC
  56.  
  57.     IFND    PT__CIA                ; CIA Support
  58. PT__CIA        =    0            ; Supply PT_SetIntRate with
  59.     ENDC                    ; rate (32-255) in D0. Do not
  60.                         ; trash registers.
  61.  
  62.     IFND    PT__DMADelay            ; 80 is Commodore's
  63. PT__DMADelay    =    80            ; recommendation.
  64.     ENDC
  65.  
  66.     IFND    PT__68020            ; 68020+ optimisations
  67. PT__68020    =    0
  68.     ENDC
  69.  
  70.     IFND    PT__NTComp            ; Noisetracker compatibility
  71. PT__NTComp    =    1
  72.     ENDC
  73.  
  74. n_note        equ    0    ; w
  75. n_cmd        equ    2    ; w
  76. n_cmdlo        equ    3    ; b
  77. n_start        equ    4    ; l
  78. n_length    equ    8    ; w
  79. n_loopstart    equ    10    ; l
  80. n_replen    equ    14    ; w
  81. n_period    equ    16    ; w
  82. n_finetune    equ    18    ; b
  83. n_volume    equ    19    ; b
  84. n_dmabit    equ    20    ; w
  85. n_toneportdirec    equ    22    ; b
  86. n_toneportspeed    equ    23    ; b
  87. n_wantedperiod    equ    24    ; w
  88. n_vibratocmd    equ    26    ; b
  89. n_vibratopos    equ    27    ; b
  90. n_tremolocmd    equ    28    ; b
  91. n_tremolopos    equ    29    ; b
  92. n_wavecontrol    equ    30    ; b
  93. n_glissfunk    equ    31    ; b
  94. n_sampleoffset    equ    32    ; b
  95. n_pattpos    equ    33    ; b
  96. n_loopcount    equ    34    ; b
  97. n_funkoffset    equ    35    ; b
  98. n_wavestart    equ    36    ; l
  99. n_reallength    equ    40    ; w
  100.  
  101. ;------------------------------------------------------------------------------
  102. ;Macro:        PT_WaitDMA()
  103. ;Purpose:    Waits for the DMA-delay to expire before continuing.
  104. ;------------------------------------------------------------------------------
  105. PT_WaitDMA    macro
  106.         move.w    $dff006,d1
  107.         moveq.l    #PT__DMADelay-1,d0
  108. .dmaloop1    cmp.w    $dff006,d1
  109.         beq.s    .dmaloop1
  110.         move.w    $dff006,d1
  111. .dmaloop2    cmp.w    $dff006,d1
  112.         beq.s    .dmaloop2
  113.         move.w    $dff006,d1
  114.            dbf    d0,.dmaloop1
  115.         endm
  116.  
  117. ;------------------------------------------------------------------------------
  118. ;Function:    PT_Init(Module)(A0)
  119. ;Purpose:    Initializes the play-routine and restarts the module if it's
  120. ;        already playing. The module may have up to 256 patterns.
  121. ;------------------------------------------------------------------------------
  122. PT_Init        move.b    #0,PT_speed
  123.         move.l    a0,PT_songdataptr
  124.         move.l    a0,a1
  125.         lea.l    952(a1),a1
  126.         moveq.l    #128-1,d0
  127.         moveq.l    #0,d1
  128. PT_loop        move.l    d1,d2
  129.         subq.w    #1,d0
  130. PT_loop2    move.b    (a1)+,d1
  131.         cmp.b    d2,d1
  132.         bgt.s    PT_loop
  133.         dbra    d0,PT_loop2
  134.         addq.b    #1,d2
  135.  
  136.         lea.l    PT_samplestarts(pc),a1
  137.         lsl.l    #8,d2
  138.         lsl.l    #2,d2
  139.         add.l    #1084,d2
  140.         add.l    a0,d2
  141.         move.l    d2,a2
  142.         moveq.l    #31-1,d0
  143. PT_loop3    cmp.l    a2,a3
  144.         blt.s    .range
  145.  
  146.         clr.l    (a2)
  147. .range        move.l    a2,(a1)+
  148.         moveq.l    #0,d1
  149.         move.w    42(a0),d1        ; sample length
  150.         beq.b    .nosample
  151.         lsl.l    #1,d1
  152.         add.l    d1,a2
  153. .nosample    add.l    #30,a0
  154.         dbra    d0,PT_loop3
  155.  
  156.     ifne PT__NTComp
  157.         move.b    951(a0),d1
  158.         cmp.b    #$7f,d1
  159.         beq.s    .NotNT        ; ProTracker module
  160.         cmp.b    #$78,d1
  161.         beq.w    .NotNT        ; Old 15-instrument converted
  162.  
  163. .WasNT        move.l    #6,PT_vibshift
  164.         move.b    d1,PT_looppos
  165.         bra.s    .GotFormat
  166.  
  167. .NotNT        move.l    #7,PT_vibshift
  168.         clr.b    PT_looppos
  169. .GotFormat
  170.     endc
  171.  
  172.     ifne PT__CIA
  173.         moveq.l    #125,d0
  174.         bsr.s    PT_SetIntRate
  175.     endc
  176.  
  177.         or.b    #2,$bfe001
  178.         clr.b    PT_counter
  179.         clr.b    PT_songpos
  180.         clr.w    PT_patternpos
  181.         bsr.s    PT_KillSound
  182.         move.b    #6,PT_speed
  183.         rts
  184.  
  185. ;------------------------------------------------------------------------------
  186. ;Function:    PT_End()
  187. ;Purpose:    Stops the music.
  188. ;------------------------------------------------------------------------------
  189. PT_End        move.b    #0,PT_speed
  190.  
  191. PT_KillSound    lea.l    $dff000,a0
  192.         clr.w    $a8(a0)
  193.         clr.w    $b8(a0)
  194.         clr.w    $c8(a0)
  195.         clr.w    $d8(a0)
  196.         move.w    #$f,$dff096
  197.         rts
  198.  
  199. ;------------------------------------------------------------------------------
  200. ;Function:    PT_SetMasterVol(Left,Right)(D0,D1)
  201. ;Purpose:    Sets left and right mastervolume.
  202. ;------------------------------------------------------------------------------
  203.     ifne    PT_MasterVol
  204. PT_SetMasterVol
  205.         move.w    d0,PT_lmastervol
  206.         move.w    d1,PT_rmastervol
  207.         lea.l    $dff000,a5
  208.  
  209.         moveq.l    #0,d0
  210.         lea.l    PT_chan1temp(pc),a0
  211.         move.b    n_volume(a0),d0
  212.         mulu.w    PT_lmastervol,d0
  213.         lsr.w    #6,d0
  214.         move.b    d0,$a8(a5)
  215.  
  216.         moveq.l    #0,d0
  217.         lea.l    PT_chan2temp(pc),a0
  218.         move.b    n_volume(a0),d0
  219.         mulu.w    PT_rmastervol,d0
  220.         lsr.w    #6,d0
  221.         move.b    d0,$b8(a5)
  222.  
  223.         moveq.l    #0,d0
  224.         lea.l    PT_chan3temp(pc),a0
  225.         move.b    n_volume(a0),d0
  226.         mulu.w    PT_rmastervol,d0
  227.         lsr.w    #6,d0
  228.         move.b    d0,$c8(a5)
  229.  
  230.         moveq.l    #0,d0
  231.         lea.l    PT_chan4temp(pc),a0
  232.         move.b    n_volume(a0),d0
  233.         mulu.w    PT_lmastervol,d0
  234.         lsr.w    #6,d0
  235.         move.b    d0,$d8(a5)
  236.  
  237.         moveq.l    #0,d0
  238.         rts
  239.     endc
  240.  
  241. PT_calcvol    macro
  242.  
  243.     ifne    PT_MasterVol
  244.  
  245.         move.l    a5,d5
  246.         subq.l    #1,d5
  247.         and.w    #32,d5
  248.         beq.s    .left
  249.  
  250. .right        mulu.w    PT_rmastervol(pc),d0
  251.         bra.s    .volend
  252.  
  253. .left        mulu.w    PT_lmastervol(pc),d0
  254. .volend        lsr.w    #6,d0
  255.     endc
  256.  
  257.     endm
  258.  
  259. ;------------------------------------------------------------------------------
  260. ;Function:    PT_Rewind()
  261. ;Purpose:    Jumps one pattern backwards.
  262. ;------------------------------------------------------------------------------
  263.     ifne    PT__WindFuncs
  264. PT_Rewind    bsr.w    PT_KillSound
  265.  
  266.         move.b    PT_songpos,d0
  267.         tst.b    d0
  268.         bne.s    .not0
  269.  
  270.         move.l    PT_songdataptr,a0    ; get moduleptr.
  271.         move.b    950(a0),PT_songpos
  272.         sub.b    #2,PT_songpos
  273.     ifne PT__OverStep
  274.         move.w    #-1,PT_OverStep
  275.     endc
  276.         bra.s    .ok
  277.  
  278. .not0        cmp.b    #1,d0
  279.         bne.s    .not1
  280.  
  281.         move.l    PT_songdataptr,a0    ; get moduleptr.
  282.         move.b    950(a0),PT_songpos
  283.         sub.b    #1,PT_songpos
  284.         bra.s    .ok
  285.  
  286. .not1
  287.         sub.b    #2,PT_songpos
  288. .ok        move.w    #63*16,PT_patternpos
  289.         move.b    PT_speed(pc),PT_counter
  290.  
  291.         moveq.l    #0,d0
  292.         rts
  293.  
  294. ;------------------------------------------------------------------------------
  295. ;Function:    PT_Forward()
  296. ;Purpose:    Jumps one pattern forwards.
  297. ;------------------------------------------------------------------------------
  298. PT_Forward    bsr.w    PT_KillSound
  299.         move.w    #63*16,PT_patternpos
  300.         move.b    PT_speed(pc),PT_counter
  301.  
  302.         moveq.l    #0,d0
  303.         rts
  304.     endc
  305.  
  306. ;------------------------------------------------------------------------------
  307. ;Function:    PT_Music()
  308. ;Purpose:    Updates the music. Call with steady intervals, preferably 50
  309. ;        times a second.
  310. ;------------------------------------------------------------------------------
  311. PT_Music    addq.b    #1,PT_counter
  312.         move.b    PT_counter(pc),d0
  313.         move.b    PT_speed(pc),d1
  314.         beq.w    PT_return
  315.         cmp.b    d1,d0
  316.         blo.s    PT_nonewnote
  317.         clr.b    PT_counter
  318.         tst.b    PT_pattdeltime2
  319.         beq.w    PT_getnewnote
  320.         bsr.s    PT_nonewallchannels
  321.         bra.w    PT_dskip
  322.  
  323. PT_nonewnote    bsr.s    PT_nonewallchannels
  324.         bra.w    PT_nonewposyet
  325.  
  326. PT_nonewallchannels
  327.         lea.l    $dff0a0,a5
  328.         lea.l    PT_chan1temp(pc),a6
  329.         bsr.w    PT_checkefx
  330.         lea.l    $dff0b0,a5
  331.         lea.l    PT_chan2temp(pc),a6
  332.         bsr.w    PT_checkefx
  333.         lea.l    $dff0c0,a5
  334.         lea.l    PT_chan3temp(pc),a6
  335.         bsr.w    PT_checkefx
  336.         lea.l    $dff0d0,a5
  337.         lea.l    PT_chan4temp(pc),a6
  338.         bra.w    PT_checkefx
  339.  
  340. PT_getnewnote    move.l    PT_songdataptr(pc),a0
  341.         lea.l    12(a0),a3
  342.         lea.l    952(a0),a2        ;pattpo
  343.         lea.l    1084(a0),a0        ;patterndata
  344.         moveq.l    #0,d0
  345.         moveq.l    #0,d1
  346.         move.b    PT_songpos(pc),d0
  347.         move.b    (a2,d0.w),d1
  348.         lsl.l    #8,d1
  349.         lsl.l    #2,d1
  350.         add.w    PT_patternpos(pc),d1
  351.         clr.w    PT_dmacontemp
  352.  
  353.         lea.l    $dff0a0,a5
  354.         lea.l    PT_chan1temp(pc),a6
  355.         bsr.s    PT_playvoice
  356.  
  357.         lea.l    $dff0b0,a5
  358.         lea.l    PT_chan2temp(pc),a6
  359.         bsr.s    PT_playvoice
  360.  
  361.         lea.l    $dff0c0,a5
  362.         lea.l    PT_chan3temp(pc),a6
  363.         bsr.s    PT_playvoice
  364.  
  365.         lea.l    $dff0d0,a5
  366.         lea.l    PT_chan4temp(pc),a6
  367.         bsr.s    PT_playvoice
  368.  
  369.         bra.w    PT_setdma
  370.  
  371. PT_playvoice    tst.w    (a6)
  372.         bne.s    PT_plvskip
  373.         bsr.w    PT_pernop
  374.  
  375. PT_plvskip    move.l    (a0,d1.l),(a6)
  376.         addq.l    #4,d1
  377.         moveq.l    #0,d2
  378.         move.b    n_cmd(a6),d2
  379.         and.b    #$f0,d2
  380.         lsr.b    #4,d2
  381.         move.b    (a6),d0
  382.         and.b    #$f0,d0
  383.         or.b    d0,d2
  384.         tst.b    d2
  385.         beq.w    PT_setregs
  386.         moveq.l    #0,d3
  387.         lea.l    PT_samplestarts(pc),a1
  388.         move.w    d2,d4
  389.         subq.l    #1,d2
  390.  
  391.         mulu.w    #30,d4
  392.  
  393.     ifeq    PT__68020
  394.         lsl.l    #2,d2
  395.         move.l    (a1,d2.l),n_start(a6)
  396.     else
  397.         move.l    (a1,d2.l*4),n_start(a6)
  398.     endc
  399.  
  400.         move.w    (a3,d4.l),n_length(a6)
  401.         move.w    (a3,d4.l),n_reallength(a6)
  402.         move.b    2(a3,d4.l),n_finetune(a6)
  403.         move.b    3(a3,d4.l),n_volume(a6)
  404.         move.w    4(a3,d4.l),d3        ; get repeat
  405.         tst.w    d3
  406.         beq.s    PT_noloop
  407.         move.l    n_start(a6),d2        ; get start
  408.         add.w    d3,d3
  409.         add.l    d3,d2            ; add repeat
  410.         move.l    d2,n_loopstart(a6)
  411.         move.l    d2,n_wavestart(a6)
  412.         move.w    4(a3,d4.l),d0        ; get repeat
  413.         add.w    6(a3,d4.l),d0        ; add replen
  414.         move.w    d0,n_length(a6)
  415.         move.w    6(a3,d4.l),n_replen(a6)    ; save replen
  416.         moveq.l    #0,d0
  417.         move.b    n_volume(a6),d0
  418.  
  419.         PT_calcvol
  420.  
  421.         move.w    d0,8(a5)        ; set volume
  422.         bra.s    PT_setregs
  423.  
  424. PT_noloop    move.l    n_start(a6),d2
  425.         add.l    d3,d2
  426.         move.l    d2,n_loopstart(a6)
  427.         move.l    d2,n_wavestart(a6)
  428.         move.w    6(a3,d4.l),n_replen(a6)    ; save replen
  429.         moveq.l    #0,d0
  430.         move.b    n_volume(a6),d0
  431.  
  432.         PT_calcvol
  433.  
  434.         move.w    d0,8(a5)        ; set volume
  435.  
  436. PT_setregs    move.w    (a6),d0
  437.         and.w    #$0fff,d0
  438.         beq.w    PT_checkmoreefx        ; if no note
  439.         move.w    2(a6),d0
  440.         and.w    #$0ff0,d0
  441.         cmp.w    #$0e50,d0
  442.         beq.s    PT_dosetfinetune
  443.         move.b    2(a6),d0
  444.         and.b    #$0f,d0
  445.         cmp.b    #3,d0            ; toneportamento
  446.         beq.s    PT_chktoneporta
  447.         cmp.b    #5,d0
  448.         beq.s    PT_chktoneporta
  449.         cmp.b    #9,d0            ; sample offset
  450.         bne.s    PT_setperiod
  451.         bsr.w    PT_checkmoreefx
  452.         bra.s    PT_setperiod
  453.  
  454. PT_dosetfinetune
  455.         bsr.w    PT_setfinetune
  456.         bra.s    PT_setperiod
  457.  
  458. PT_chktoneporta
  459.         bsr.w    PT_settoneporta
  460.         bra.w    PT_checkmoreefx
  461.  
  462. PT_setperiod    move.w    (a6),d7
  463.         and.w    #$0fff,d7
  464.         lea.l    PT_periodtable(pc),a4
  465.         moveq.l    #0,d0
  466.         moveq.l    #36,d2
  467. PT_ftuloop    cmp.w    (a4,d0.w),d7
  468.         bhs.s    PT_ftufound
  469.         addq.l    #2,d0
  470.         dbra    d2,PT_ftuloop
  471. PT_ftufound    moveq.l    #0,d7
  472.         move.b    n_finetune(a6),d7
  473.         mulu.w    #36*2,d7
  474.         add.l    d7,a4
  475.         move.w    (a4,d0.w),n_period(a6)
  476.  
  477.         move.w    2(a6),d0
  478.         and.w    #$0ff0,d0
  479.         cmp.w    #$0ed0,d0        ; notedelay
  480.         beq.w    PT_checkmoreefx
  481.  
  482.         move.w    n_dmabit(a6),$dff096
  483.         btst    #2,n_wavecontrol(a6)
  484.         bne.s    PT_vibnoc
  485.         clr.b    n_vibratopos(a6)
  486.  
  487. PT_vibnoc    btst    #6,n_wavecontrol(a6)
  488.         bne.s    PT_trenoc
  489.         clr.b    n_tremolopos(a6)
  490.  
  491. PT_trenoc    move.l    n_start(a6),(a5)    ; set start
  492.         move.w    n_length(a6),4(a5)    ; set length
  493.         move.w    n_period(a6),d0
  494.         move.w    d0,6(a5)        ; set period
  495.         move.w    n_dmabit(a6),d0
  496.         or.w    d0,PT_dmacontemp
  497.         bra.w    PT_checkmoreefx
  498.  
  499. PT_setdma    lea.l    $bfe000,a5
  500.  
  501.         PT_WaitDMA
  502.  
  503. PT_dummy001    move.w    PT_dmacontemp(pc),d0
  504.         or.w    #$8000,d0
  505.         move.w    d0,$dff096
  506.  
  507.         PT_WaitDMA
  508.  
  509.         lea.l    $dff000,a5
  510.         lea.l    PT_chan4temp(pc),a6
  511.         move.l    n_loopstart(a6),$d0(a5)
  512.         move.w    n_replen(a6),$d4(a5)
  513.         lea.l    PT_chan3temp(pc),a6
  514.         move.l    n_loopstart(a6),$c0(a5)
  515.         move.w    n_replen(a6),$c4(a5)
  516.         lea.l    PT_chan2temp(pc),a6
  517.         move.l    n_loopstart(a6),$b0(a5)
  518.         move.w    n_replen(a6),$b4(a5)
  519.         lea.l    PT_chan1temp(pc),a6
  520.         move.l    n_loopstart(a6),$a0(a5)
  521.         move.w    n_replen(a6),$a4(a5)
  522.  
  523. PT_dskip    add.w    #16,PT_patternpos
  524.         move.b    PT_pattdeltime(pc),d0
  525.         beq.s    PT_dskc
  526.         move.b    d0,PT_pattdeltime2
  527.         clr.b    PT_pattdeltime
  528.  
  529. PT_dskc        tst.b    PT_pattdeltime2
  530.         beq.s    PT_dska
  531.         subq.b    #1,PT_pattdeltime2
  532.         beq.s    PT_dska
  533.         sub.w    #16,PT_patternpos
  534.  
  535. PT_dska        tst.b    PT_pbreakflag
  536.         beq.s    PT_nnpysk
  537.         sf    PT_pbreakflag
  538.         moveq.l    #0,d0
  539.         move.b    PT_pbreakpos(pc),d0
  540.         clr.b    PT_pbreakpos
  541.  
  542.         lsl.w    #4,d0
  543.         move.w    d0,PT_patternpos
  544.  
  545. PT_nnpysk    cmp.w    #1024,PT_patternpos
  546.         blo.s    PT_nonewposyet
  547.  
  548. PT_nextposition
  549.         moveq.l    #0,d0
  550.         move.b    PT_pbreakpos(pc),d0
  551.         move.w    d0,PT_patternpos
  552.         clr.b    PT_pbreakpos
  553.         clr.b    PT_posjumpflag
  554.         addq.b    #1,PT_songpos
  555.         and.b    #$7f,PT_songpos
  556.         move.b    PT_songpos(pc),d1
  557.  
  558.         move.l    PT_songdataptr(pc),a0
  559.         cmp.b    950(a0),d1
  560.         blo.s    PT_nonewposyet
  561.     ifne PT__OverStep
  562.         move.w    #1,PT_OverStep
  563.     endc
  564.     ifne PT__NTComp
  565.         move.b    PT_looppos,PT_songpos
  566.     else
  567.         clr.b    PT_songpos
  568.     endc
  569.  
  570. PT_nonewposyet
  571.         tst.b    PT_posjumpflag
  572.         bne.s    PT_nextposition
  573. PT_return    rts
  574.  
  575. PT_checkefx    bsr.w    PT_updatefunk
  576.         move.w    n_cmd(a6),d0
  577.         and.w    #$0fff,d0
  578.         beq.s    PT_pernop
  579.         move.b    n_cmd(a6),d0
  580.         and.b    #$0f,d0
  581.         beq.s    PT_arpeggio
  582.         cmp.b    #1,d0
  583.         beq.w    PT_portaup
  584.         cmp.b    #2,d0
  585.         beq.w    PT_portadown
  586.         cmp.b    #3,d0
  587.         beq.w    PT_toneportamento
  588.         cmp.b    #4,d0
  589.         beq.w    PT_vibrato
  590.         cmp.b    #5,d0
  591.         beq.w    PT_toneplusvolslide
  592.         cmp.b    #6,d0
  593.         beq.w    PT_vibratoplusvolslide
  594.         cmp.b    #$e,d0
  595.         beq.w    PT_e_commands
  596. setback        move.w    n_period(a6),6(a5)
  597.         cmp.b    #7,d0
  598.         beq.w    PT_tremolo
  599.         cmp.b    #$a,d0
  600.         beq.w    PT_volumeslide
  601.         rts
  602.  
  603. PT_pernop    move.w    n_period(a6),6(a5)
  604.         rts
  605.  
  606. PT_arpeggio    moveq.l    #0,d0
  607.         move.b    PT_counter(pc),d0
  608.         divs.w    #3,d0
  609.         swap.w    d0
  610.         tst.w    d0
  611.         beq.s    PT_arpeggio2
  612.         cmp.w    #2,d0
  613.         beq.s    PT_arpeggio1
  614.         moveq.l    #0,d0
  615.         move.b    n_cmdlo(a6),d0
  616.         lsr.b    #4,d0
  617.         bra.s    PT_arpeggio3
  618.  
  619. PT_arpeggio1    moveq.l    #0,d0
  620.         move.b    n_cmdlo(a6),d0
  621.         and.b    #15,d0
  622.         bra.s    PT_arpeggio3
  623.  
  624. PT_arpeggio2    move.w    n_period(a6),d2
  625.         bra.s    PT_arpeggio4
  626.  
  627. PT_arpeggio3    add.w    d0,d0
  628.         moveq.l    #0,d1
  629.         move.b    n_finetune(a6),d1
  630.         mulu.w    #36*2,d1
  631.         lea.l    PT_periodtable(pc),a0
  632.         add.l    d1,a0
  633.         moveq.l    #0,d1
  634.         move.w    n_period(a6),d1
  635.         moveq.l    #36,d3
  636.  
  637. PT_arploop    move.w    (a0,d0.w),d2
  638.         cmp.w    (a0),d1
  639.         bhs.s    PT_arpeggio4
  640.         addq.l    #2,a0
  641.         dbra    d3,PT_arploop
  642.         rts
  643.  
  644. PT_arpeggio4    move.w    d2,6(a5)
  645.         rts
  646.  
  647. PT_fineportaup    tst.b    PT_counter
  648.         bne.w    PT_return
  649.         move.b    #$0f,PT_lowmask
  650.  
  651. PT_portaup    moveq.l    #0,d0
  652.         move.b    n_cmdlo(a6),d0
  653.         and.b    PT_lowmask(pc),d0
  654.         move.b    #$ff,PT_lowmask
  655.         sub.w    d0,n_period(a6)
  656.         move.w    n_period(a6),d0
  657.         and.w    #$0fff,d0
  658.         cmp.w    #113,d0
  659.         bpl.s    PT_portauskip
  660.         and.w    #$f000,n_period(a6)
  661.         or.w    #113,n_period(a6)
  662.  
  663. PT_portauskip    move.w    n_period(a6),d0
  664.         and.w    #$0fff,d0
  665.         move.w    d0,6(a5)
  666.         rts
  667.  
  668. PT_fineportadown
  669.         tst.b    PT_counter
  670.         bne.w    PT_return
  671.         move.b    #$0f,PT_lowmask
  672.  
  673. PT_portadown    clr.w    d0
  674.         move.b    n_cmdlo(a6),d0
  675.         and.b    PT_lowmask(pc),d0
  676.         move.b    #$ff,PT_lowmask
  677.         add.w    d0,n_period(a6)
  678.         move.w    n_period(a6),d0
  679.         and.w    #$0fff,d0
  680.         cmp.w    #856,d0
  681.         bmi.s    PT_portadskip
  682.         and.w    #$f000,n_period(a6)
  683.         or.w    #856,n_period(a6)
  684.  
  685. PT_portadskip    move.w    n_period(a6),d0
  686.         and.w    #$0fff,d0
  687.         move.w    d0,6(a5)
  688.         rts
  689.  
  690. PT_settoneporta
  691.         move.l    a0,-(sp)
  692.         move.w    (a6),d2
  693.         and.w    #$0fff,d2
  694.         moveq.l    #0,d0
  695.         move.b    n_finetune(a6),d0
  696.         mulu.w    #37*2,d0
  697.         lea.l    PT_periodtable(pc),a0
  698.         add.l    d0,a0
  699.         moveq.l    #0,d0
  700.  
  701. PT_stploop    cmp.w    (a0,d0.w),d2
  702.         bhs.s    PT_stpfound
  703.         addq.w    #2,d0
  704.         cmp.w    #37*2,d0
  705.         blo.s    PT_stploop
  706.         moveq.l    #35*2,d0
  707.  
  708. PT_stpfound    move.b    n_finetune(a6),d2
  709.         and.b    #8,d2
  710.         beq.s    PT_stpgoss
  711.         tst.w    d0
  712.         beq.s    PT_stpgoss
  713.         subq.w    #2,d0
  714.  
  715. PT_stpgoss    move.w    (a0,d0.w),d2
  716.         move.l    (sp)+,a0
  717.         move.w    d2,n_wantedperiod(a6)
  718.         move.w    n_period(a6),d0
  719.         clr.b    n_toneportdirec(a6)
  720.         cmp.w    d0,d2
  721.         beq.s    PT_cleartoneporta
  722.         bge.w    PT_return
  723.         move.b    #1,n_toneportdirec(a6)
  724.         rts
  725.  
  726. PT_cleartoneporta
  727.         clr.w    n_wantedperiod(a6)
  728.         rts
  729.  
  730. PT_toneportamento
  731.         move.b    n_cmdlo(a6),d0
  732.         beq.s    PT_toneportnochange
  733.         move.b    d0,n_toneportspeed(a6)
  734.         clr.b    n_cmdlo(a6)
  735.  
  736. PT_toneportnochange
  737.         tst.w    n_wantedperiod(a6)
  738.         beq.w    PT_return
  739.         moveq.l    #0,d0
  740.         move.b    n_toneportspeed(a6),d0
  741.         tst.b    n_toneportdirec(a6)
  742.         bne.s    PT_toneportaup
  743.  
  744. PT_toneportadown
  745.         add.w    d0,n_period(a6)
  746.         move.w    n_wantedperiod(a6),d0
  747.         cmp.w    n_period(a6),d0
  748.         bgt.s    PT_toneportasetper
  749.         move.w    n_wantedperiod(a6),n_period(a6)
  750.         clr.w    n_wantedperiod(a6)
  751.         bra.s    PT_toneportasetper
  752.  
  753. PT_toneportaup
  754.         sub.w    d0,n_period(a6)
  755.         move.w    n_wantedperiod(a6),d0
  756.         cmp.w    n_period(a6),d0
  757.         blt.s    PT_toneportasetper
  758.         move.w    n_wantedperiod(a6),n_period(a6)
  759.         clr.w    n_wantedperiod(a6)
  760.  
  761. PT_toneportasetper
  762.         move.w    n_period(a6),d2
  763.         move.b    n_glissfunk(a6),d0
  764.         and.b    #$0f,d0
  765.         beq.s    PT_glissskip
  766.         moveq.l    #0,d0
  767.         move.b    n_finetune(a6),d0
  768.         mulu.w    #36*2,d0
  769.         lea.l    PT_periodtable(pc),a0
  770.         add.l    d0,a0
  771.         moveq.l    #0,d0
  772.  
  773. PT_glissloop    cmp.w    (a0,d0.w),d2
  774.         bhs.s    PT_glissfound
  775.         addq.w    #2,d0
  776.         cmp.w    #36*2,d0
  777.         blo.s    PT_glissloop
  778.         moveq.l    #35*2,d0
  779.  
  780. PT_glissfound    move.w    (a0,d0.w),d2
  781.  
  782. PT_glissskip    move.w    d2,6(a5)        ; set period
  783.         rts
  784.  
  785. PT_vibrato    move.b    n_cmdlo(a6),d0
  786.         beq.s    PT_vibrato2
  787.         move.b    n_vibratocmd(a6),d2
  788.         and.b    #$0f,d0
  789.         beq.s    PT_vibskip
  790.         and.b    #$f0,d2
  791.         or.b    d0,d2
  792.  
  793. PT_vibskip    move.b    n_cmdlo(a6),d0
  794.         and.b    #$f0,d0
  795.         beq.s    PT_vibskip2
  796.         and.b    #$0f,d2
  797.         or.b    d0,d2
  798.  
  799. PT_vibskip2    move.b    d2,n_vibratocmd(a6)
  800.  
  801. PT_vibrato2    move.b    n_vibratopos(a6),d0
  802.         lea.l    PT_vibratotable(pc),a4
  803.         lsr.w    #2,d0
  804.         and.w    #$001f,d0
  805.         moveq.l    #0,d2
  806.         move.b    n_wavecontrol(a6),d2
  807.         and.b    #$03,d2
  808.         beq.s    PT_vib_sine
  809.         lsl.b    #3,d0
  810.         cmp.b    #1,d2
  811.         beq.s    PT_vib_rampdown
  812.         move.b    #255,d2
  813.         bra.s    PT_vib_set
  814.  
  815. PT_vib_rampdown
  816.         tst.b    n_vibratopos(a6)
  817.         bpl.s    PT_vib_rampdown2
  818.         move.b    #255,d2
  819.         sub.b    d0,d2
  820.         bra.s    PT_vib_set
  821.  
  822. PT_vib_rampdown2
  823.         move.b    d0,d2
  824.         bra.s    PT_vib_set
  825.  
  826. PT_vib_sine    move.b    (a4,d0.w),d2
  827.  
  828. PT_vib_set    move.b    n_vibratocmd(a6),d0
  829.         and.w    #15,d0
  830.         mulu.w    d0,d2
  831.     ifne PT__NTComp
  832.         move.l    PT_vibshift,d0
  833.         lsr.w    d0,d2
  834.     else
  835.         lsr.w    #7,d2
  836.     endc
  837.         move.w    n_period(a6),d0
  838.         tst.b    n_vibratopos(a6)
  839.         bmi.s    PT_vibratoneg
  840.         add.w    d2,d0
  841.         bra.s    PT_vibrato3
  842.  
  843. PT_vibratoneg    sub.w    d2,d0
  844.  
  845. PT_vibrato3    move.w    d0,6(a5)
  846.         move.b    n_vibratocmd(a6),d0
  847.         lsr.w    #2,d0
  848.         and.w    #$003c,d0
  849.         add.b    d0,n_vibratopos(a6)
  850.         rts
  851.  
  852. PT_toneplusvolslide
  853.         bsr.w    PT_toneportnochange
  854.         bra.w    PT_volumeslide
  855.  
  856. PT_vibratoplusvolslide
  857.         bsr.s    PT_vibrato2
  858.         bra.w    PT_volumeslide
  859.  
  860. PT_tremolo    move.b    n_cmdlo(a6),d0
  861.         beq.s    PT_tremolo2
  862.         move.b    n_tremolocmd(a6),d2
  863.         and.b    #$0f,d0
  864.         beq.s    PT_treskip
  865.         and.b    #$f0,d2
  866.         or.b    d0,d2
  867.  
  868. PT_treskip    move.b    n_cmdlo(a6),d0
  869.         and.b    #$f0,d0
  870.         beq.s    PT_treskip2
  871.         and.b    #$0f,d2
  872.         or.b    d0,d2
  873.  
  874. PT_treskip2    move.b    d2,n_tremolocmd(a6)
  875.  
  876. PT_tremolo2    move.b    n_tremolopos(a6),d0
  877.         lea.l    PT_vibratotable(pc),a4
  878.         lsr.w    #2,d0
  879.         and.w    #$001f,d0
  880.         moveq.l    #0,d2
  881.         move.b    n_wavecontrol(a6),d2
  882.         lsr.b    #4,d2
  883.         and.b    #$03,d2
  884.         beq.s    PT_tre_sine
  885.         lsl.b    #3,d0
  886.         cmp.b    #1,d2
  887.         beq.s    PT_tre_rampdown
  888.         move.b    #255,d2
  889.         bra.s    PT_tre_set
  890.  
  891. PT_tre_rampdown
  892.         tst.b    n_vibratopos(a6)
  893.         bpl.s    PT_tre_rampdown2
  894.         move.b    #255,d2
  895.         sub.b    d0,d2
  896.         bra.s    PT_tre_set
  897.  
  898. PT_tre_rampdown2
  899.         move.b    d0,d2
  900.         bra.s    PT_tre_set
  901.  
  902. PT_tre_sine    move.b    (a4,d0.w),d2
  903.  
  904. PT_tre_set    move.b    n_tremolocmd(a6),d0
  905.         and.w    #15,d0
  906.         mulu.w    d0,d2
  907.         lsr.w    #6,d2
  908.         moveq.l    #0,d0
  909.         move.b    n_volume(a6),d0
  910.         tst.b    n_tremolopos(a6)
  911.         bmi.s    PT_tremoloneg
  912.         add.w    d2,d0
  913.         bra.s    PT_tremolo3
  914.  
  915. PT_tremoloneg    sub.w    d2,d0
  916.  
  917. PT_tremolo3    bpl.s    PT_tremoloskip
  918.         clr.w    d0
  919.  
  920. PT_tremoloskip
  921.         cmp.w    #$40,d0
  922.         bls.s    PT_tremolook
  923.         move.w    #$40,d0
  924.  
  925. PT_tremolook    PT_calcvol
  926.  
  927.         move.w    d0,8(a5)
  928.         move.b    n_tremolocmd(a6),d0
  929.         lsr.w    #2,d0
  930.         and.w    #$003c,d0
  931.         add.b    d0,n_tremolopos(a6)
  932.         rts
  933.  
  934. PT_sampleoffset
  935.         moveq.l    #0,d0
  936.         move.b    n_cmdlo(a6),d0
  937.         beq.s    PT_sononew
  938.         move.b    d0,n_sampleoffset(a6)
  939.  
  940. PT_sononew    move.b    n_sampleoffset(a6),d0
  941.         lsl.w    #7,d0
  942.         cmp.w    n_length(a6),d0
  943.         bge.s    PT_sofskip
  944.         sub.w    d0,n_length(a6)
  945.         add.w    d0,d0
  946.         add.l    d0,n_start(a6)
  947.         rts
  948.  
  949. PT_sofskip    move.w    #$0001,n_length(a6)
  950.         rts
  951.  
  952. PT_volumeslide
  953.         moveq.l    #0,d0
  954.         move.b    n_cmdlo(a6),d0
  955.         lsr.b    #4,d0
  956.         tst.b    d0
  957.         beq.s    PT_volslidedown
  958.  
  959. PT_volslideup    add.b    d0,n_volume(a6)
  960.         cmp.b    #$40,n_volume(a6)
  961.         bmi.s    PT_vsuskip
  962.         move.b    #$40,n_volume(a6)
  963.  
  964. PT_vsuskip    move.b    n_volume(a6),d0
  965.  
  966.         PT_calcvol
  967.  
  968.         move.w    d0,8(a5)
  969.         rts
  970.  
  971. PT_volslidedown
  972.         moveq.l    #0,d0
  973.         move.b    n_cmdlo(a6),d0
  974.         and.b    #$0f,d0
  975.  
  976. PT_volslidedown2
  977.         sub.b    d0,n_volume(a6)
  978.         bpl.s    PT_vsdskip
  979.         clr.b    n_volume(a6)
  980.  
  981. PT_vsdskip    moveq.l    #0,d0
  982.         move.b    n_volume(a6),d0
  983.  
  984.         PT_calcvol
  985.  
  986.         move.w    d0,8(a5)
  987.         rts
  988.  
  989. PT_positionjump
  990.         move.b    n_cmdlo(a6),d0
  991.         subq.b    #1,d0
  992.         move.b    d0,PT_songpos
  993.     ifne PT__OverStep
  994.         move.w    #1,PT_OverStep
  995.     endc
  996. PT_pj2        clr.b    PT_pbreakpos
  997.         st    PT_posjumpflag
  998.         rts
  999.  
  1000. PT_volumechange
  1001.         moveq.l    #0,d0
  1002.         move.b    n_cmdlo(a6),d0
  1003.         cmp.b    #$40,d0
  1004.         bls.s    PT_volumeok
  1005.         moveq.l    #$40,d0
  1006.  
  1007. PT_volumeok    move.b    d0,n_volume(a6)
  1008.  
  1009.         PT_calcvol
  1010.  
  1011.         move.w    d0,8(a5)
  1012.         rts
  1013.  
  1014. PT_patternbreak
  1015.         moveq.l    #0,d0
  1016.         move.b    n_cmdlo(a6),d0
  1017.         move.l    d0,d2
  1018.         lsr.b    #4,d0
  1019.         mulu.w    #10,d0
  1020.         and.b    #$0f,d2
  1021.         add.b    d2,d0
  1022.         cmp.b    #63,d0
  1023.         bhi.s    PT_pj2
  1024.         move.b    d0,PT_pbreakpos
  1025.         st    PT_posjumpflag
  1026.         rts
  1027.  
  1028. PT_setspeed
  1029.         moveq.l    #0,d0
  1030.         move.b    3(a6),d0
  1031.  
  1032.     ifne PT__OverStep
  1033.         bne.s    .wasnotzero
  1034.         move.w    #1,PT_OverStep
  1035. .wasnotzero
  1036.     endc
  1037.  
  1038.     ifne    PT__CIA
  1039.         cmp.b    #32,d0
  1040.         blo.s    .setspeed
  1041.  
  1042. .settempo    bsr.w    PT_SetIntRate
  1043.         rts
  1044.  
  1045.     endc
  1046.  
  1047. .setspeed    clr.b    PT_counter
  1048.         move.b    d0,PT_speed
  1049.         rts
  1050.  
  1051. PT_checkmoreefx
  1052.         bsr.w    PT_updatefunk
  1053.         move.b    2(a6),d0
  1054.         and.b    #$0f,d0
  1055.         cmp.b    #$9,d0
  1056.         beq.w    PT_sampleoffset
  1057.         cmp.b    #$b,d0
  1058.         beq.w    PT_positionjump
  1059.         cmp.b    #$d,d0
  1060.         beq.w    PT_patternbreak
  1061.         cmp.b    #$e,d0
  1062.         beq.s    PT_e_commands
  1063.         cmp.b    #$f,d0
  1064.         beq.w    PT_setspeed
  1065.         cmp.b    #$c,d0
  1066.         beq.w    PT_volumechange
  1067.         bra.w    PT_pernop
  1068.  
  1069. PT_e_commands    move.b    n_cmdlo(a6),d0
  1070.         and.b    #$f0,d0
  1071.         lsr.b    #4,d0
  1072.         beq.s    PT_filteronoff
  1073.         cmp.b    #1,d0
  1074.         beq.w    PT_fineportaup
  1075.         cmp.b    #2,d0
  1076.         beq.w    PT_fineportadown
  1077.         cmp.b    #3,d0
  1078.         beq.s    PT_setglisscontrol
  1079.         cmp.b    #4,d0
  1080.         beq.w    PT_setvibratocontrol
  1081.         cmp.b    #5,d0
  1082.         beq.w    PT_setfinetune
  1083.         cmp.b    #6,d0
  1084.         beq.w    PT_jumploop
  1085.         cmp.b    #7,d0
  1086.         beq.w    PT_settremolocontrol
  1087.         cmp.b    #9,d0
  1088.         beq.w    PT_retrignote
  1089.         cmp.b    #$a,d0
  1090.         beq.w    PT_volumefineup
  1091.         cmp.b    #$b,d0
  1092.         beq.w    PT_volumefinedown
  1093.         cmp.b    #$c,d0
  1094.         beq.w    PT_notecut
  1095.         cmp.b    #$d,d0
  1096.         beq.w    PT_notedelay
  1097.         cmp.b    #$e,d0
  1098.         beq.w    PT_patterndelay
  1099.         cmp.b    #$f,d0
  1100.         beq.w    PT_funkit
  1101.         rts
  1102.  
  1103. PT_filteronoff
  1104.         move.b    n_cmdlo(a6),d0
  1105.         and.b    #1,d0
  1106.         add.b    d0,d0
  1107.         and.b    #$fd,$bfe001
  1108.         or.b    d0,$bfe001
  1109.         rts    
  1110.  
  1111. PT_setglisscontrol
  1112.         move.b    n_cmdlo(a6),d0
  1113.         and.b    #$0f,d0
  1114.         and.b    #$f0,n_glissfunk(a6)
  1115.         or.b    d0,n_glissfunk(a6)
  1116.         rts
  1117.  
  1118. PT_setvibratocontrol
  1119.         move.b    n_cmdlo(a6),d0
  1120.         and.b    #$0f,d0
  1121.         and.b    #$f0,n_wavecontrol(a6)
  1122.         or.b    d0,n_wavecontrol(a6)
  1123.         rts
  1124.  
  1125. PT_setfinetune
  1126.         move.b    n_cmdlo(a6),d0
  1127.         and.b    #$0f,d0
  1128.         move.b    d0,n_finetune(a6)
  1129.         rts
  1130.  
  1131. PT_jumploop    tst.b    PT_counter
  1132.         bne.w    PT_return
  1133.         move.b    n_cmdlo(a6),d0
  1134.         and.b    #$0f,d0
  1135.         beq.s    PT_setloop
  1136.         tst.b    n_loopcount(a6)
  1137.         beq.s    PT_jumpcnt
  1138.         subq.b    #1,n_loopcount(a6)
  1139.         beq.w    PT_return
  1140.  
  1141. PT_jmploop    move.b    n_pattpos(a6),PT_pbreakpos
  1142.         st    PT_pbreakflag
  1143.         rts
  1144.  
  1145. PT_jumpcnt    move.b    d0,n_loopcount(a6)
  1146.         bra.s    PT_jmploop
  1147.  
  1148. PT_setloop    move.w    PT_patternpos(pc),d0
  1149.         lsr.w    #4,d0
  1150.         move.b    d0,n_pattpos(a6)
  1151.         rts
  1152.  
  1153. PT_settremolocontrol
  1154.         move.b    n_cmdlo(a6),d0
  1155.         and.b    #$0f,d0
  1156.         lsl.b    #4,d0
  1157.         and.b    #$0f,n_wavecontrol(a6)
  1158.         or.b    d0,n_wavecontrol(a6)
  1159.         rts
  1160.  
  1161. PT_retrignote    move.l    d1,-(sp)
  1162.         moveq.l    #0,d0
  1163.         move.b    n_cmdlo(a6),d0
  1164.         and.b    #$0f,d0
  1165.         beq.s    PT_rtnend
  1166.         moveq.l    #0,d1
  1167.         move.b    PT_counter(pc),d1
  1168.         bne.s    PT_rtnskp
  1169.         move.w    (a6),d1
  1170.         and.w    #$0fff,d1
  1171.         bne.s    PT_rtnend
  1172.         moveq.l    #0,d1
  1173.         move.b    PT_counter(pc),d1
  1174.  
  1175. PT_rtnskp    divu.w    d0,d1
  1176.         swap.w    d1
  1177.         tst.w    d1
  1178.         bne.s    PT_rtnend
  1179.  
  1180. PT_doretrig    move.w    n_dmabit(a6),$dff096    ; channel dma off
  1181.         move.l    n_start(a6),(a5)    ; set sampledata pointer
  1182.         move.w    n_length(a6),4(a5)    ; set length
  1183.         move.w    #300,d0
  1184.  
  1185. PT_rtnloop1    dbra    d0,PT_rtnloop1
  1186.         move.w    n_dmabit(a6),d0
  1187.         bset    #15,d0
  1188.         move.w    d0,$dff096
  1189.         move.w    #300,d0
  1190.  
  1191. PT_rtnloop2    dbra    d0,PT_rtnloop2
  1192.         move.l    n_loopstart(a6),(a5)
  1193.         move.l    n_replen(a6),4(a5)
  1194.  
  1195. PT_rtnend    move.l    (sp)+,d1
  1196.         rts
  1197.  
  1198. PT_volumefineup
  1199.         tst.b    PT_counter
  1200.         bne.w    PT_return
  1201.         moveq.l    #0,d0
  1202.         move.b    n_cmdlo(a6),d0
  1203.         and.b    #$f,d0
  1204.         bra.w    PT_volslideup
  1205.  
  1206. PT_volumefinedown
  1207.         tst.b    PT_counter
  1208.         bne.w    PT_return
  1209.         moveq.l    #0,d0
  1210.         move.b    n_cmdlo(a6),d0
  1211.         and.b    #$0f,d0
  1212.         bra.w    PT_volslidedown2
  1213.  
  1214. PT_notecut    moveq.l    #0,d0
  1215.         move.b    n_cmdlo(a6),d0
  1216.         and.b    #$0f,d0
  1217.         cmp.b    PT_counter(pc),d0
  1218.         bne.w    PT_return
  1219.         clr.b    n_volume(a6)
  1220.         move.w    #0,8(a5)
  1221.         rts
  1222.  
  1223. PT_notedelay    moveq.l    #0,d0
  1224.         move.b    n_cmdlo(a6),d0
  1225.         and.b    #$0f,d0
  1226.         cmp.b    PT_counter(pc),d0
  1227.         bne.w    PT_return
  1228.         move.w    (a6),d0
  1229.         beq.w    PT_return
  1230.         move.l    d1,-(sp)
  1231.         bra.w    PT_doretrig
  1232.  
  1233. PT_patterndelay
  1234.         tst.b    PT_counter
  1235.         bne.w    PT_return
  1236.         moveq.l    #0,d0
  1237.         move.b    n_cmdlo(a6),d0
  1238.         and.b    #$0f,d0
  1239.         tst.b    PT_pattdeltime2
  1240.         bne.w    PT_return
  1241.         addq.b    #1,d0
  1242.         move.b    d0,PT_pattdeltime
  1243.         rts
  1244.  
  1245. PT_funkit    tst.b    PT_counter
  1246.         bne.w    PT_return
  1247.         move.b    n_cmdlo(a6),d0
  1248.         and.b    #$0f,d0
  1249.         lsl.b    #4,d0
  1250.         and.b    #$0f,n_glissfunk(a6)
  1251.         or.b    d0,n_glissfunk(a6)
  1252.         tst.b    d0
  1253.         beq.w    PT_return
  1254.  
  1255. PT_updatefunk    movem.l    a0/d1,-(sp)
  1256.         moveq.l    #0,d0
  1257.         move.b    n_glissfunk(a6),d0
  1258.         lsr.b    #4,d0
  1259.         beq.s    PT_funkend
  1260.         lea.l    PT_funktable(pc),a0
  1261.         move.b    (a0,d0.w),d0
  1262.         add.b    d0,n_funkoffset(a6)
  1263.         btst    #7,n_funkoffset(a6)
  1264.         beq.s    PT_funkend
  1265.         clr.b    n_funkoffset(a6)
  1266.  
  1267.         move.l    n_loopstart(a6),d0
  1268.         moveq.l    #0,d1
  1269.         move.w    n_replen(a6),d1
  1270.         add.l    d1,d0
  1271.         add.l    d1,d0
  1272.         move.l    n_wavestart(a6),a0
  1273.         addq.l    #1,a0
  1274.         cmp.l    d0,a0
  1275.         blo.s    PT_funkok
  1276.         move.l    n_loopstart(a6),a0
  1277.  
  1278. PT_funkok    move.l    a0,n_wavestart(a6)
  1279.         moveq.l    #-1,d0
  1280.         sub.b    (a0),d0
  1281.         move.b    d0,(a0)
  1282.  
  1283. PT_funkend    movem.l    (sp)+,a0/d1
  1284.         rts
  1285.  
  1286. PT_funktable    dc.b    0,5,6,7,8,10,11,13,16,19,22,26,32,43,64,128
  1287.  
  1288. PT_vibratotable    
  1289.         dc.b    000,024,049,074,097,120,141,161
  1290.         dc.b    180,197,212,224,235,244,250,253
  1291.         dc.b    255,253,250,244,235,224,212,197
  1292.         dc.b    180,161,141,120,097,074,049,024
  1293.  
  1294. PT_periodtable
  1295. ; tuning 0, normal
  1296.         dc.w    856,808,762,720,678,640,604,570,538,508,480,453
  1297.         dc.w    428,404,381,360,339,320,302,285,269,254,240,226
  1298.         dc.w    214,202,190,180,170,160,151,143,135,127,120,113
  1299. ; tuning 1
  1300.         dc.w    850,802,757,715,674,637,601,567,535,505,477,450
  1301.         dc.w    425,401,379,357,337,318,300,284,268,253,239,225
  1302.         dc.w    213,201,189,179,169,159,150,142,134,126,119,113
  1303. ; tuning 2
  1304.         dc.w    844,796,752,709,670,632,597,563,532,502,474,447
  1305.         dc.w    422,398,376,355,335,316,298,282,266,251,237,224
  1306.         dc.w    211,199,188,177,167,158,149,141,133,125,118,112
  1307. ; tuning 3
  1308.         dc.w    838,791,746,704,665,628,592,559,528,498,470,444
  1309.         dc.w    419,395,373,352,332,314,296,280,264,249,235,222
  1310.         dc.w    209,198,187,176,166,157,148,140,132,125,118,111
  1311. ; tuning 4
  1312.         dc.w    832,785,741,699,660,623,588,555,524,495,467,441
  1313.         dc.w    416,392,370,350,330,312,294,278,262,247,233,220
  1314.         dc.w    208,196,185,175,165,156,147,139,131,124,117,110
  1315. ; tuning 5
  1316.         dc.w    826,779,736,694,655,619,584,551,520,491,463,437
  1317.         dc.w    413,390,368,347,328,309,292,276,260,245,232,219
  1318.         dc.w    206,195,184,174,164,155,146,138,130,123,116,109
  1319. ; tuning 6
  1320.         dc.w    820,774,730,689,651,614,580,547,516,487,460,434
  1321.         dc.w    410,387,365,345,325,307,290,274,258,244,230,217
  1322.         dc.w    205,193,183,172,163,154,145,137,129,122,115,109
  1323. ; tuning 7
  1324.         dc.w    814,768,725,684,646,610,575,543,513,484,457,431
  1325.         dc.w    407,384,363,342,323,305,288,272,256,242,228,216
  1326.         dc.w    204,192,181,171,161,152,144,136,128,121,114,108
  1327. ; tuning -8
  1328.         dc.w    907,856,808,762,720,678,640,604,570,538,508,480
  1329.         dc.w    453,428,404,381,360,339,320,302,285,269,254,240
  1330.         dc.w    226,214,202,190,180,170,160,151,143,135,127,120
  1331. ; tuning -7
  1332.         dc.w    900,850,802,757,715,675,636,601,567,535,505,477
  1333.         dc.w    450,425,401,379,357,337,318,300,284,268,253,238
  1334.         dc.w    225,212,200,189,179,169,159,150,142,134,126,119
  1335. ; tuning -6
  1336.         dc.w    894,844,796,752,709,670,632,597,563,532,502,474
  1337.         dc.w    447,422,398,376,355,335,316,298,282,266,251,237
  1338.         dc.w    223,211,199,188,177,167,158,149,141,133,125,118
  1339. ; tuning -5
  1340.         dc.w    887,838,791,746,704,665,628,592,559,528,498,470
  1341.         dc.w    444,419,395,373,352,332,314,296,280,264,249,235
  1342.         dc.w    222,209,198,187,176,166,157,148,140,132,125,118
  1343. ; tuning -4
  1344.         dc.w    881,832,785,741,699,660,623,588,555,524,494,467
  1345.         dc.w    441,416,392,370,350,330,312,294,278,262,247,233
  1346.         dc.w    220,208,196,185,175,165,156,147,139,131,123,117
  1347. ; tuning -3
  1348.         dc.w    875,826,779,736,694,655,619,584,551,520,491,463
  1349.         dc.w    437,413,390,368,347,328,309,292,276,260,245,232
  1350.         dc.w    219,206,195,184,174,164,155,146,138,130,123,116
  1351. ; tuning -2
  1352.         dc.w    868,820,774,730,689,651,614,580,547,516,487,460
  1353.         dc.w    434,410,387,365,345,325,307,290,274,258,244,230
  1354.         dc.w    217,205,193,183,172,163,154,145,137,129,122,115
  1355. ; tuning -1
  1356.         dc.w    862,814,768,725,684,646,610,575,543,513,484,457
  1357.         dc.w    431,407,384,363,342,323,305,288,272,256,242,228
  1358.         dc.w    216,203,192,181,171,161,152,144,136,128,121,114
  1359.  
  1360. PT_chan1temp    dc.l    0,0,0,0,0,$00010000,0,  0,0,0,0
  1361. PT_chan2temp    dc.l    0,0,0,0,0,$00020000,0,  0,0,0,0
  1362. PT_chan3temp    dc.l    0,0,0,0,0,$00040000,0,  0,0,0,0
  1363. PT_chan4temp    dc.l    0,0,0,0,0,$00080000,0,  0,0,0,0
  1364.  
  1365.     cnop    0,4
  1366. PT_samplestarts
  1367.         dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1368.         dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1369.  
  1370. PT_songdataptr    dc.l    0
  1371.  
  1372. PT_speed    dc.b    0
  1373. PT_counter    dc.b    0
  1374. PT_songpos    dc.b    0
  1375. PT_pbreakpos    dc.b    0
  1376. PT_posjumpflag    dc.b    0
  1377. PT_pbreakflag    dc.b    0
  1378. PT_lowmask    dc.b    0
  1379. PT_pattdeltime    dc.b    0
  1380. PT_pattdeltime2    dc.b    0
  1381.     ifne PT__NTComp
  1382. PT_looppos    dc.b    0
  1383.     endc
  1384.     even
  1385. PT_patternpos    dc.w    0
  1386. PT_dmacontemp    dc.w    0
  1387.     ifne PT__OverStep
  1388. PT_OverStep    dc.w    0
  1389.     endc
  1390.     ifne PT__NTComp
  1391. PT_vibshift    dc.l    0
  1392.     endc
  1393. PT_lmastervol    dc.w    64
  1394. PT_rmastervol    dc.w    64
  1395.  
  1396.